home *** CD-ROM | disk | FTP | other *** search
/ Die Ultimative Software-P…i Collection 1996 & 1997 / Die Ultimative Software-Pakete CD-ROM fur Atari Collection 1996 & 1997.iso / d / druck / drucker / puffer / liesmich next >
Encoding:
Text File  |  1996-11-17  |  8.7 KB  |  182 lines

  1. ******************************************************************************
  2. Wilfried Cordes, Kennedystraße 20, 2900 Oldenburg
  3. ******************************************************************************
  4. Beschreibung zu PFFR.PRG
  5. ******************************************************************************
  6. Oldenburg, 14.9.'90
  7.  
  8. PFFR ist frei kopierbar. Es ist allerdings nicht erwünscht, daß das Programm
  9. verkauft oder mit kommerziellen Programmen zusammen vertrieben wird.
  10.  
  11. Wer das Programm häufiger benutzt, sollte dem Autor DM 20,-- zukommen lassen.
  12. Dafür gibt es dann noch die aktuellste Version zurück.
  13.  
  14. PFFR ist ein kleiner Druckerspooler, der hauptsächlich dazu dient, die 
  15. Druckausgabe zu beschleunigen,  weniger den Rechner frühzeitig freizugeben. 
  16. Die Beschleunigung des Druckens resultiert daraus, daß an Stelle der 
  17. BIOS-Druckausgabe nach dem Pollingprinzip eine interruptgesteuerte 
  18. Druckausgabe erfolgt.
  19.  
  20. Polling bedeutet, daß vor jeder Ausgabe auf den Druckerausgang nachgeschaut 
  21. wird, ob die 'BUSY'-Leitung am Druckerausgang auf logisch 'HIGH' liegt. Wenn 
  22. dies der Fall ist, ist entweder der Puffer des Druckers voll oder es ist gar 
  23. keiner angeschlossen. TOS wartet nun maximal dreißig Sekunden und kehrt dann 
  24. mit Fehlermeldung zurück.
  25.  
  26. Eine interruptgesteuerte Ausgabe hat nun den großen Vorteil, daß sie nicht 
  27. nachschauen muß, ob der Drucker 'BUSY' ist. Die Interruptroutine kommt immer 
  28. dann ans Ruder, wenn der Zustand der 'BUSY'-Leitung von logisch 'HIGH' auf 
  29. logisch 'LOW' wechselt, der Drucker also seine Bereitschaft zu erkennen gibt, 
  30. weitere Zeichen anzunehmen. 
  31. Dieser Interrupt ist normalerweise gesperrt, da er vom Betriebssystem nicht 
  32. benutzt wird. Er läßt sich jedoch recht leicht aktivieren. 
  33.  
  34. Zu diesem Zweck wird wie folgt vorgegangen:
  35.  
  36. 1) In den BUSYInterruptvektor hex. $100, dez. 256, wird die Adresse der 
  37.    Routine eingetragen, die die Druckausgabe erledigen soll.
  38.  
  39. 2) Die Leitung 0 (von acht) des E/A-Ports des MFP (Multi Function Peripheral) 
  40.    wird als Eingang geschaltet. Hier liegt die BUSYleitung des Druckerports 
  41.    an. Das Schalten auf Eingang geschieht durch das Löschen des Bits 0 im 
  42.    MFP-'Data Direction Register' (DDR). Dies ist zwar schon der normale 
  43.    Zustand, aber sicher ist sicher....
  44.  
  45. 3) Im MFP-'Active Edge Register' (AER) wird Bit 0 gelöscht. Dies stellt 
  46.    sicher, daß der BUSYInterrupt beim Übergang von 'HIGH' auf 'LOW' ausgelöst 
  47.    wird.
  48.  
  49. 4) Als vorletzte Aktion wird die Ausmaskierung des BUSYInterrupt aufgehoben, 
  50.    indem Bit 0 des MFP-'Interrupt Mask Registers B' (IMRB) gesetzt wird.
  51.    Bit 0 des MFP-Registers B steuert die Interrupts an Leitung 0 des MFP, was 
  52.    ja die BUSYleitung ist ....
  53.  
  54. 5) Zu guter Letzt (fast) wird Bit 0 im MFP-'Interrupt Enable Register B' 
  55.    gesetzt und damit der Interrupt endlich eingeschaltet.
  56.  
  57. Soweit, so schön. Aber:
  58. Warum sollte die BUSYleitung jemals von 'besetzt' auf 'frei' umschalten, wenn 
  59. sie niemals auf 'besetzt' war?
  60. Wo kriegen wir die Zeichen her, die auf's Papier sollen?
  61. Wie kriegen wir die Routinen dauerhaft im Speicher installiert?
  62.  
  63. Für die letzte Frage gibt es zwei mögliche Antworten:
  64.  
  65. 1) Eine Installation als Accessory.
  66.  
  67. 2) Eine Installation als speicherresidentes Programm zum Beispiel für den 
  68.    AUTOordner.
  69.  
  70. Diese zweite Möglichkeit wurde für PFFR gewählt. Der Vorteil sind 
  71. hauptsächlich eine geringere Programmgröße und ein geringerer 
  72. Programmieraufwand. Außerdem blockiert PFFR keinen Eintrag im Deskmenü, an 
  73. denen ja sowieso stets Mangel herrscht.
  74.  
  75. Der Speicher für den Puffer wird aber nicht zur Laufzeit angefordert, sondern
  76. beim Start reserviert. 
  77. Dies hat leider zur Folge, daß der Puffer immer im Speicher ist, auch wenn
  78. er inaktiv ist.
  79.  
  80. --------------------------------------------------------------------------
  81. Die Größe des Puffers wird in Namen eincodiert. Die 5. bis 8. Position des
  82. Namens geben die Puffergröße an:
  83. PFFR0110 -> 110 KBytes, PFFR0005 -> 5 Kbytes.
  84. Alle vier Buchstaben müssen besetzt sein!
  85. --------------------------------------------------------------------------
  86.  
  87. Schon fünf Kbytes bringen eine deutliche Beschleunigung der Druckausgabe.
  88.  
  89. Wo kommen nun die Zeichen her, die vom BUSYInterrupt an den Drucker gegeben 
  90. werden können?
  91.  
  92. Eine halbe Antwort gab's bereits im vorigen Absatz: Aus einem Puffer, der beim 
  93. Programmstart im RAM des Rechners angelegt wird.
  94.  
  95. Die Druckausgabe des ATARI erfolgt über die BIOSfunktion Nr. 3 'BCONOUT'.
  96. Alle Zeichen, die zum Drucker sollen, müssen hier vorbei. Was liegt also 
  97. näher, als diesen Ausgang umzubiegen auf eine Routine, die die betreffenden 
  98. Zeichen in den Druckerpuffer schreibt. Das wird nun  auch getan, wobei aber 
  99. zwei Dinge zu beachten sind:
  100.  
  101. Erstens ist 'BCONOUT' die Standardausgabefunktion für alle Geräte, als da 
  102. wären Bildschirm, Tastatur, MIDI- und V.24-Schnittstelle sowie der Drucker- 
  103. ausgang. Die neue Routine muß also noch die Gerätenummer prüfen, bevor das 
  104. Zeichen in den Puffer geschrieben wird. Falls ein anderes Gerät angesprochen 
  105. wird, muß die Originalroutine angesprungen werden.
  106.  
  107. Zweitens kann diese Funktion im USER- oder im SUPERVISORmodus aufgerufen wer- 
  108. den. Im  ersten Fall liegen die Daten auf dem USERStapel, ansonsten auf den 
  109. SUPERVISORStapel. Beim Aufruf im SUPERVISORmodus liegen noch das 
  110. Statusregister (SR, Wort) und der Programmzähler (PC, Langwort) mit auf dem 
  111. Stapel, so daß die benötigten Daten alle um sechs Bytes höher auf dem Stapel 
  112. liegen. 
  113.  
  114. Außerdem bedient PFFR noch die BIOSfunktion BCOSTAT (Nr. 8), die den 
  115. Ausgabestatus der parallelen Schnittstelle liefert. Hier wird stattdessen 
  116. zurückgegeben, ob der Puffer voll ist oder nicht.
  117.  
  118. Die letzte offene Frage nach dem Anstoßen des BUSYInterrupts kann wie folgt 
  119. beantwortet werden:
  120.  
  121. Es wird ein weiterer Interrupt angezapft und zwar der 'etv_timer'-Interrupt, 
  122. der 50 mal pro Sekunde auftritt und vom Systemtimer ausgelöst wird. Die 
  123. Adresse der Interruptroutine steht in der Systemvariable 'etv_timer' auf 
  124. Adresse hex. $400, dez. 1024. Hier wird die Adresse einer eigenen Routine
  125. eingetragen, die die erste Druckausgabe erledigt, bis der BUSYInterrupt
  126. ihm die Arbeit abnimmt. Das eigene Programm muß nach erledigter Arbeit
  127. noch dafür sorgen, daß die Systemroutinen wieder angesprungen werden.
  128.  
  129. PFFR rettet die Adressen der Betriebssystemroutinen in sogenannten 'XBRA'- 
  130. Strukturen:
  131.  
  132. typedef struct
  133. {
  134.         char    xb_magic[4];    /* "XBRA" -> Strukturkennung */
  135.         char    xb_id[4];       /* "DPVA" -> Programmkennung */
  136.         long    xb_oldvec;      /* vorherige Adresse des Vektors */
  137. } XBRA;
  138.  
  139. Damit ist es dem Programm möglich, zu erkennen, ob es schon installiert 
  140. worden ist und zweitens kann es sich auch wieder ausklinken. Schließlich ist 
  141. es auch anderen Programmen möglich, den Druckerpuffer zu identifizieren.
  142.  
  143. In PUFFER gibt es somit drei XBRAStrukturen. eine vor der neuen BIOSroutine,
  144. eine vor der BUSYinterrupt- und eine vor der etv_timer-Routine.
  145.  
  146. Beim Programmstart prüft das Programm aber nur die Busystruktur!
  147. Dies kann in unglücklichen Fällen zu einiger Wirrnis führen, wenn nämlich ein 
  148. anderes Programm den BIOS- oder den etv_timer-Interrupt testen, aber nicht 
  149. den BIOSvektor. Da aber nur der Busyinterrupt von maximal einer Routine 
  150. genutzt werden kann, der etv_timer und das BIOS aber mehrere Treiber 
  151. vertragen, ist das nicht so problematisch.
  152.  
  153. Zum Schluß noch eine Erklärung zur eigentlichen Druckausgabe. Die 
  154. Vorgehensweise ist wie folgt:
  155.  
  156. - Interrupts sperren.
  157.  
  158. - Nachschauen, ob der Drucker BUSY ist, was er eigentlich nicht sein kann, da 
  159.   die Routine ja gerade dann angesprungen wird, wenn der Drucker die 
  160.   BUSYleitung freigibt, aber der etv_timer liefert ja auch Daten.
  161.  
  162. - Nachschauen, ob überhaupt ein Zeichen im Puffer zur Ausgabe ansteht.
  163.  
  164. - Nun wird ein Zeichen auf die acht Datenleitungen der 
  165.   Centronics-Schnittstelle gelegt, indem es in den Port B des 'Programmable 
  166.   Sound Generators' (PSG) geschrieben wird.
  167.  
  168. - Nun muß noch die 'STROBE'-Leitung, auf der dem Drucker mitgeteilt wird, daß 
  169.   das Byte auf der Leitung gedruckt werden soll, kurzzeitig auf logisch 'LOW' 
  170.   gehen. Die STROBEleitung liegt an Bit 5 des Port A des PSG's.
  171.  
  172. - Abschließend wird Bit 0 'Interrupt in Service Register B' gelöscht, womit 
  173.   angezeigt ist, daß der BUSYInterrupt bedient worden ist. (Dies natürlich 
  174.   nur, falls die Schreibroutine vom BUSYinterrupt aufgerufen worden ist, 
  175.   falls  der etv_timer-Interrupt die Routine aufgerufen hat, werden nur die 
  176.   Interrupts wieder freigegeben.)
  177.  
  178. Kein Gewähr für Fehlerfreiheit, keine Haftung für Schäden, die evtl. durch 
  179. Fehler in PFFR verursacht werden.
  180.  
  181. *E*N*D*E*  *E*N*D*E*  *E*N*D*E*  *E*N*D*E*  *E*N*D*E*  *E*N*D*E*  *E*N*D*E*
  182.